/*
 * huize Service Inc
 * All Rights Reserved @2018
 */
package com.huize.zhike.framework.common.asserts;


import com.huize.ladon.apm.common.constant.CommonConstants;
import com.huize.ladon.apm.common.util.MixAllUtils;
import com.huize.ladon.apm.common.enums.DateTypeEnum;
import com.huize.zhike.framework.common.enumeration.ErrorEnum;
import com.huize.zhike.framework.common.result.ParamListWrapper;
import org.apache.commons.lang3.StringUtils;

import java.util.Collection;

/**
 * 统一断言拓展类
 *
 * @author tianyuliang
 * @version $Id: AssertExt.java, v0.1 2018/10/15
 */
public class AssertExt extends Assert {

    /**
     * 校验参数正确
     *
     * @param expResult 期望结果
     * @param desc      期望结果为false时异常描述
     */
    public static void assertParameterValid(boolean expResult, String desc) {
        isTrue(expResult, ErrorEnum.INVALID_PARAMS, desc);
    }

    /**
     * 校验参数正确
     *
     * @param expResult 实际结果为false时抛出异常
     */
    public static void assertParameterValid(boolean expResult) {
        isTrue(expResult, ErrorEnum.INVALID_PARAMS);
    }

    /**
     * 校验参数不为null
     */
    public static void assertParameter(Object object) {
        isTrue(object != null, ErrorEnum.INVALID_PARAMS);
    }

    /**
     * 校验参数不为null
     */
    public static void assertParameter(Object object, ErrorEnum errorEnum) {
        boolean ok = object != null;
        assertParameter(ok, errorEnum);
    }

    /**
     * 校验参数不为null，实际结果为false时抛出异常
     */
    public static void assertParameter(boolean ok, ErrorEnum errorEnum) {
        isTrue(ok, errorEnum);
    }

    /**
     * 校验 ParamListWrapper 有效
     */
    public static void assertParamListWrapper(ParamListWrapper wrapper) {
        isTrue(wrapper != null && wrapper.getItems() != null && wrapper.getItems().size() > 0, ErrorEnum.LIST_PARAM_INVALID);
    }

    /**
     * 校验 List 有效
     */
    public static void assertList(Collection<?> items) {
        isTrue(items != null && items.size() > 0, ErrorEnum.LIST_PARAM_INVALID);
        for (Object item : items) {
            isTrue(item != null, ErrorEnum.LIST_ITEM_PARAM_INVALID);
        }
    }

    /**
     * 校验 主键Id 参数有效
     */
    public static void assertSerialId(Integer serialId) {
        isTrue(serialId != null && serialId > 0, ErrorEnum.SERIAL_ID_PARAM_INVALID);
    }

    /**
     * 校验 主键Id列表 参数有效
     */
    public static void assertSerialIds(String serialIds) {
        isTrue(StringUtils.isNotBlank(serialIds), ErrorEnum.SERIAL_ID_PARAM_INVALID);
        String[] values = serialIds.trim().split(CommonConstants.DEFAULT_JOIN_SEPARATOR);
        for (String value : values) {
            isTrue(StringUtils.isNotBlank(value), ErrorEnum.SERIAL_ID_PARAM_INVALID);
            isTrue(MixAllUtils.parseInteger(value) > 0, ErrorEnum.SERIAL_ID_PARAM_INVALID);
        }
    }

    /**
     * 校验 日期类型 参数有效
     */
    public static void assertDateTypeEnum(DateTypeEnum typeEnum) {
        isTrue(typeEnum != null && DateTypeEnum.checkValidType(typeEnum), ErrorEnum.DATE_TYPE_INVALID);
    }

}
